// package关键字：声明当前类所在的包，用于组织和管理代码
// com.itheima.abstract1：包名，通常采用公司域名反写+项目名的形式
package com.itheima.abstract1;

// 抽象类：这是一个类的注释，说明这个类是抽象类
// public：访问修饰符，表示这个类可以被其他任何类访问
// abstract：关键字，表示这个类是抽象类
// 抽象类的特点：1. 不能被实例化 2. 可以包含抽象方法和普通方法 3. 子类必须实现所有抽象方法（除非子类也是抽象类）
// class：关键字，用于定义一个类
// A：类名，采用驼峰命名法，首字母大写
public abstract class A {
    // private：访问修饰符，表示这个属性只能在本类中访问
    // String：数据类型，表示字符串类型
    // name：属性名，用于存储名字信息
    // 抽象类可以有成员变量，与普通类一样
    private String name;
    
    // private：访问修饰符
    // int：数据类型，表示整数类型
    // age：属性名，用于存储年龄信息
    private int age;
    
    // public：访问修饰符
    // A()：构造方法，方法名与类名相同，无返回值
    // 无参构造方法：不接受任何参数的构造方法
    // 抽象类可以有构造方法，但不能通过new直接调用（因为抽象类不能实例化）
    public A() {
        // System.out.println()：Java的输出语句
        // "A的无参构造器"：要打印的字符串内容
        // 当创建子类对象时，会先调用父类（抽象类）的构造方法
        System.out.println("A的无参构造器");
    } // 无参构造方法结束标记
    
    // public：访问修饰符
    // A(String name, int age)：有参构造方法
    // String name, int age：参数列表，接收两个参数
    // 抽象类可以有有参构造方法，用于初始化成员变量
    public A(String name, int age) {
        // this.name：表示当前对象的name属性
        // name：表示传入的参数
        // 将传入的name参数赋值给当前对象的name属性
        this.name = name;
        
        // this.age：表示当前对象的age属性
        // age：表示传入的参数
        // 将传入的age参数赋值给当前对象的age属性
        this.age = age;
    } // 有参构造方法结束标记
    
    // 抽象方法：这是一个方法的注释，说明抽象方法的特点
    // public：访问修饰符
    // abstract：关键字，表示这是一个抽象方法
    // void：返回值类型，表示这个方法没有返回值
    // show()：方法名
    // 抽象方法的特点：1. 必须用abstract修饰 2. 没有方法体（没有{}和方法实现） 3. 必须在抽象类中定义
    // 子类必须实现父类的所有抽象方法（除非子类也是抽象类）
    public abstract void show();
    
    // public：访问修饰符
    // void：返回值类型
    // show1()：方法名
    // 抽象类可以包含普通的非抽象方法，这些方法有完整的实现
    public void show1() {
        // System.out.println()：输出语句
        // "show1方法"：要打印的字符串内容
        // 这是一个普通方法的实现
        System.out.println("show1方法");
    } // show1方法结束标记
    
    // public：访问修饰符
    // String：返回值类型，表示这个方法返回一个字符串
    // getName()：getter方法，用于获取name属性的值
    // 这是Java中的封装特性，提供公共的访问方式来获取私有属性
    public String getName() {
        // return：关键字，表示结束方法并返回一个值
        // name：要返回的属性值
        // 返回当前对象的name属性值
        return name;
    } // getName方法结束标记
    
    // public：访问修饰符
    // void：返回值类型
    // setName(String name)：setter方法，用于设置name属性的值
    // String name：参数，接收要设置的名字值
    // 这是Java中的封装特性，提供公共的访问方式来设置私有属性
    public void setName(String name) {
        // this.name：表示当前对象的name属性
        // name：表示传入的参数
        // 将传入的name参数赋值给当前对象的name属性
        this.name = name;
    } // setName方法结束标记
    
    // public：访问修饰符
    // int：返回值类型，表示这个方法返回一个整数
    // getAge()：getter方法，用于获取age属性的值
    public int getAge() {
        // return：关键字
        // age：要返回的属性值
        // 返回当前对象的age属性值
        return age;
    } // getAge方法结束标记
    
    // public：访问修饰符
    // void：返回值类型
    // setAge(int age)：setter方法，用于设置age属性的值
    // int age：参数，接收要设置的年龄值
    public void setAge(int age) {
        // this.age：表示当前对象的age属性
        // age：表示传入的参数
        // 将传入的age参数赋值给当前对象的age属性
        this.age = age;
    } // setAge方法结束标记
} // A类（抽象类）结束标记
